package wci.frontend.pascal;

import wci.frontend.*;
import wci.message.Message;

import static wci.frontend.pascal.PascalTokenType.*;
import static wci.frontend.pascal.PascalErrorCode.*;
import static wci.message.MessageType.SYNTAX_ERROR;

/**
 * <h1>PascalErrorHandler</h1>
 *
 * <p>Pascal语法错误处理类</p>
 *
 * <p>Copyright (c) 2009 by Ronald Mak</p>
 * <p>For instructional purposes only.  No warranties.</p>
 */
public class PascalErrorHandler
{	
	//能忍受的最大错误数
    private static final int MAX_ERRORS = 25;
    //错误计数
    private static int errorCount = 0;  
    public int getErrorCount()
    {
        return errorCount;
    }

    /**
     * 标记错误Token
     * @param token 有错误的token
     * @param errorCode 错误编码
     * @param parser 解析器
     */
    public void flag(Token token, PascalErrorCode errorCode, Parser parser)
    {
        // 通知解析器的监听器
        parser.sendMessage(new Message(SYNTAX_ERROR,
                                       new Object[] {token.getLineNumber(),
                                                     token.getPosition(),
                                                     token.getText(),
                                                     errorCode.toString()}));

        if (++errorCount > MAX_ERRORS) {
            abortTranslation(TOO_MANY_ERRORS, parser);
        }
    }

   /**
    * 通知解析器的监听器，然后终止翻译，
    * @param errorCode 错误编码
    * @param parser 解析器
    */
    public void abortTranslation(PascalErrorCode errorCode, Parser parser)
    {
        String fatalText = "FATAL ERROR: " + errorCode.toString();
        parser.sendMessage(new Message(SYNTAX_ERROR,
                                       new Object[] {0,
                                                     0,
                                                     "",
                                                     fatalText}));
        System.exit(errorCode.getStatus());
    }
}
